package com.tinet.reservas;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import com.tinet.reservas.bean.UsuarioBean;
import com.tinet.reservas.model.Usuario;

import excepciones.ExisteUsuarioException;
import excepciones.ValidarUsuarioException;

/**
 * 
 * Managed bean de usuario. Validacion de loggin y operaciones a nivel de
 * usuario
 * 
 * @author tinet
 */
@ManagedBean
@SessionScoped
public class ManBean implements Serializable {

    /**
     * @param serialVersionUID
     */
    private static final long serialVersionUID = 1L;

    /**
     * @EJB mapeo de usuarioBean
     */
    @EJB(mappedName = "userbean", name = "userbean")
    private transient UsuarioBean bean;
    /**
     * @param mensaje
     *            guarda los mensajes que se envian a las paginas xhml
     */
    private String mensaje = "";
    /**
     * @param usuario
     */
    private Usuario usuario;

    /**
     * 
     * @method ManBean constructor de managed bean de usuario
     * 
     */
    public ManBean() {
        if (usuario == null) {
            this.usuario = new Usuario();
        }
    }

    /**
     * 
     * @method getMensaje
     * @return string
     * 
     */
    public String getMensaje() {
        return mensaje;
    }

    /**
     * 
     * @method setMensaje
     * @param mensaje
     *            .
     * 
     */
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    /**
     * 
     * @method getUsuario
     * @return string
     * 
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * 
     * @method setUsuario
     * @param usuario
     *            .
     * 
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    // aqui empieza el crud
    /**
     * 
     * @method agregarUsuario Valida que el usuario que se esta agregando no
     *         exista antes de la bd.
     * @return String, direcciones a index o agregar usuario
     */
    public String agregarUsuario() {
        FacesContext context = FacesContext.getCurrentInstance();
        this.usuario.setId(0);
        try {
            bean.insertar(this.usuario);
        } catch (ExisteUsuarioException e) { // se valida que el nombre de
                                             // usuario no exista

            mensaje = e.mensajeError;
            context.addMessage(null, new FacesMessage("Mensaje: " + mensaje));
            return "agregarUsuario";
        }
        context.addMessage(null, new FacesMessage(
                "Mensaje: Usuario guardado con exito! "));
        return "vistaAdministrador";
    }

    /**
     * 
     * @method mostrarTodos
     * 
     * @return lista de todos los usuarios de la bd
     */
    public List<Usuario> mostrarTodos() {
        return bean.mostrarTodo();
    }

    /**
     * 
     * @method eliminar
     * @param user
     *            usuario que se desea eliminar
     * @return a la pagina mostrarUsuarios
     */
    public String eliminar(Usuario user) {
        FacesContext context = FacesContext.getCurrentInstance();
        bean.eliminar(user);
        context.addMessage(null, new FacesMessage(
                "Mensaje: Usuario eliminado con exito! "));
        return "mostrarUsuarios";
    }

    /**
     * 
     * @method mostrarUno Muestra el usuario que se quiere editar
     * @param user
     *            usuario que se quiere mostrar para poder editarlo
     */
    public void mostrarUno(Usuario user) {

        this.usuario = bean.mostrarUsuario(user);

        org.primefaces.context.RequestContext.getCurrentInstance().update(
                "formEditar:editarUsuario");
        org.primefaces.context.RequestContext.getCurrentInstance().execute(
                "PF('dialogoEditarUsuario').show()");

    }

    /**
     * 
     * @method editar edita usuario seleccionado por el usuario
     * @return direcciona a la pagina mostrarusuarios
     * @param user
     *            usuario que se quiere editar
     */
    public String editar(Usuario user) {
        FacesContext context = FacesContext.getCurrentInstance(); // esto se
                                                                  // usa para
                                                                  // mandar un
                                                                  // mensaje
                                                                  // al
                                                                  // jsf
        bean.editar(user);

        context.addMessage(null,
                new FacesMessage("Mensaje: Usuario " + user.getNombreUser()
                        + " editado con exito! "));
        return "mostrarUsuarios";
    }

    /**
     * 
     * Validar usuario se encarga de distinguir si el usuario que se logea es
     * de tipo admin o usuario normal.
     * 
     * @param user
     *            .
     * @return vistas de administrador y usuario normal
     */
    public String validarUsuario(Usuario user) {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            this.usuario = bean.validarUsuario(user);
        } catch (ValidarUsuarioException ex) {
            mensaje = ex.mensajeError;
            context.addMessage(null, new FacesMessage("Mensaje: " + mensaje));
            return "index";
        }

        if (this.usuario.getTipo().equals("1")) { // verificar si esta bien
                                                  // esta condicion
            context.addMessage(null, new FacesMessage("Mensaje: "
                    + "Bienvenido admin: " + this.usuario.getNombreUser()));
            return "vistaAdministrador";
        }
        context.addMessage(null, new FacesMessage("Mensaje: " + "Bienvenido: "
                + this.usuario.getNombreUser()));
        return "vistaUsuarioNormal";

    }
}
